﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cine
{
    public class SesionRepository: ISesionRepository
    {
        private IDictionary<long, Sesion> _sesiones;
        private ISalaRepository _salaRepository;
        private static SesionRepository _instance = null;

        private SesionRepository()
        {
            _salaRepository = SalaRepository.GetInstance();

            _sesiones = new Dictionary<long, Sesion>();
            for (int i = 0; i < 3; i++)
            {
                Sala sala = _salaRepository.Read(i+1);
                for (int j = 0; j < 3; j++)
                {
                    Create(3 * i + j + 1, sala);
                }
            }
        }

        public static SesionRepository GetInstance()
        {
            if (_instance == null)
            {
                _instance = new SesionRepository();
            }
            return _instance;
        }

        public Sesion Read(long id)
        {
            Sesion resultado;
            _sesiones.TryGetValue(id, out resultado);
            return resultado;
        }

        private Sesion Create(long id, Sala sala)
        {
            Sesion nuevaSesion = new Sesion(id, sala);
            _sesiones.Add(id, nuevaSesion);
            return nuevaSesion;
        }

        private Sesion Create(Sesion sesion)
        {
            return Create(sesion.Id, sesion.Sala);
        }

        public IList<Sesion> List(long idSala)
        {
            IList<Sesion> resultado = new List<Sesion>();
            foreach (Sesion sesion in _sesiones.Values)
            {
                Sala sala = sesion.Sala;

                if (sala.Id == idSala)
                {
                    resultado.Add(sesion);
                }
            }

            return resultado;
        }

        public Sesion Update(long id, bool abierta)
        {
            Sesion sesion = Read(id);
            if (sesion != null)
            {
                sesion.Abierta = abierta;
            }           
            return sesion;
        }
    }
}
